/**
 * 
 */
package org.mspring.platform.common;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Gao Youbo
 * @since Feb 20, 2012
 */
public class HTMLUtils {
    public static String subStringHTML(String param, int length, String end) {
        StringBuffer result = new StringBuffer();
        int n = 0;

        boolean isCode = false;
        boolean isHTML = false;
        for (int i = 0; i < param.length(); i++) {
            char temp = param.charAt(i);
            if (temp == '<') {
                isCode = true;
            } else if (temp == '&') {
                isHTML = true;
            } else if ((temp == '>') && (isCode)) {
                n -= 1;
                isCode = false;
            } else if ((temp == ';') && (isHTML)) {
                isHTML = false;
            }

            if ((!isCode) && (!isHTML)) {
                n += 1;

                if ((temp + "").getBytes().length > 1) {
                    n += 1;
                }
            }

            result.append(temp);
            if (n >= length) {
                break;
            }
        }
        result.append(end);

        String temp_result = result.toString().replaceAll("(>)[^<>]*(<?)", "$1$2");

        temp_result = temp_result.replaceAll("</?(AREA|BASE|BASEFONT|BODY|BR|COL|COLGROUP|DD|DT|FRAME|HEAD|HR|HTML|IMG|INPUT|ISINDEX|LI|LINK|META|OPTION|P|PARAM|TBODY|TD|TFOOT|TH|THEAD|TR|area|base|basefont|body|br|col|colgroup|dd|dt|frame|head|hr|html|img|input|isindex|li|link|meta|option|p|param|tbody|td|tfoot|th|thead|tr)[^<>]*/?>", "");

        temp_result = temp_result.replaceAll("<([a-zA-Z]+)[^<>]*>(.*?)</\\1>", "$2");

        Pattern p = Pattern.compile("<([a-zA-Z]+)[^<>]*>");
        Matcher m = p.matcher(temp_result);

        List endHTML = new ArrayList();

        while (m.find()) {
            endHTML.add(m.group(1));
        }

        for (int i = endHTML.size() - 1; i >= 0; i--) {
            result.append("</");
            result.append((String) endHTML.get(i));
            result.append(">");
        }
        return result.toString();
    }
}
